package com.cyl.manager.vip.mapper;

import java.util.List;
import java.time.LocalDateTime;
import com.cyl.manager.vip.domain.entity.VipAutoRenew;
import org.apache.ibatis.annotations.Param;

/**
 * VIP自动续费Mapper接口
 *
 * @author system
 * @date 2024-01-20
 */
public interface VipAutoRenewMapper
{
    /**
     * 查询VIP自动续费
     *
     * @param id VIP自动续费主键
     * @return VIP自动续费
     */
    public VipAutoRenew selectVipAutoRenewById(Long id);

    /**
     * 查询VIP自动续费列表
     *
     * @param vipAutoRenew VIP自动续费
     * @return VIP自动续费集合
     */
    public List<VipAutoRenew> selectVipAutoRenewList(VipAutoRenew vipAutoRenew);

    /**
     * 新增VIP自动续费
     *
     * @param vipAutoRenew VIP自动续费
     * @return 结果
     */
    public int insertVipAutoRenew(VipAutoRenew vipAutoRenew);

    /**
     * 修改VIP自动续费
     *
     * @param vipAutoRenew VIP自动续费
     * @return 结果
     */
    public int updateVipAutoRenew(VipAutoRenew vipAutoRenew);

    /**
     * 删除VIP自动续费
     *
     * @param id VIP自动续费主键
     * @return 结果
     */
    public int deleteVipAutoRenewById(Long id);

    /**
     * 批量删除VIP自动续费
     *
     * @param ids 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteVipAutoRenewByIds(Long[] ids);

    /**
     * 根据用户ID查询自动续费记录
     *
     * @param userId 用户ID
     * @return VIP自动续费记录
     */
    public VipAutoRenew selectVipAutoRenewByUserId(Long userId);

    /**
     * 根据用户ID和配置ID查询自动续费记录
     *
     * @param userId 用户ID
     * @param rechargeDataId VIP配置ID
     * @return VIP自动续费记录
     */
    // 应该类似这样：
    VipAutoRenew selectVipAutoRenewByUserIdAndRechargeDataId(@Param("userId") Long userId,
                                                             @Param("rechargeDataId") Long rechargeDataId);
    /**
     * 查询需要续费的记录
     *
     * @param currentTime 当前时间
     * @return 需要续费的记录列表
     */
    public List<VipAutoRenew> selectVipAutoRenewForRenewal(LocalDateTime currentTime);

    /**
     * 更新自动续费状态
     *
     * @param id 自动续费ID
     * @param status 状态
     * @return 结果
     */
    public int updateVipAutoRenewStatus(@Param("id") Long id, @Param("status") Integer status);

    /**
     * 增加重试次数
     *
     * @param id 自动续费ID
     * @param failureReason 失败原因
     * @return 结果
     */
    public int incrementRetryCount(@Param("id") Long id, @Param("failureReason") String failureReason);

    /**
     * 更新最后续费信息
     *
     * @param id 自动续费ID
     * @param lastRenewOrderSn 最后续费订单号
     * @param nextRenewTime 下次续费时间
     * @return 结果
     */
    public int updateLastRenewInfo(@Param("id") Long id, @Param("lastRenewOrderSn") String lastRenewOrderSn, @Param("nextRenewTime") LocalDateTime nextRenewTime);
}
